package com.wande.dataplatform.common.utils;

import com.wande.dataplatform.common.constant.DataPlatformConstants;

import java.util.HashMap;
import java.util.Map;

/**
 * 数据源工具类
 *
 * @author ruoyi
 */
public class DataSourceUtils {

    /**
     * 数据源驱动类映射
     */
    private static final Map<String, String> DRIVER_CLASS_MAP = new HashMap<>();

    /**
     * 数据源 JDBC URL 模板
     */
    private static final Map<String, String> JDBC_URL_TEMPLATE_MAP = new HashMap<>();

    static {
        // 驱动类映射
        DRIVER_CLASS_MAP.put(DataPlatformConstants.DataSourceType.MYSQL, "com.mysql.cj.jdbc.Driver");
        DRIVER_CLASS_MAP.put(DataPlatformConstants.DataSourceType.ORACLE, "oracle.jdbc.OracleDriver");
        DRIVER_CLASS_MAP.put(DataPlatformConstants.DataSourceType.POSTGRESQL, "org.postgresql.Driver");
        DRIVER_CLASS_MAP.put(DataPlatformConstants.DataSourceType.SQLSERVER, "com.microsoft.sqlserver.jdbc.SQLServerDriver");
        DRIVER_CLASS_MAP.put(DataPlatformConstants.DataSourceType.DAMENG, "dm.jdbc.driver.DmDriver");
        DRIVER_CLASS_MAP.put(DataPlatformConstants.DataSourceType.KINGBASE, "com.kingbase8.Driver");
        DRIVER_CLASS_MAP.put(DataPlatformConstants.DataSourceType.DORIS, "com.mysql.cj.jdbc.Driver");

        // JDBC URL 模板
        JDBC_URL_TEMPLATE_MAP.put(DataPlatformConstants.DataSourceType.MYSQL, 
            "jdbc:mysql://{host}:{port}/{database}?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai");
        JDBC_URL_TEMPLATE_MAP.put(DataPlatformConstants.DataSourceType.ORACLE, 
            "jdbc:oracle:thin:@{host}:{port}:{database}");
        JDBC_URL_TEMPLATE_MAP.put(DataPlatformConstants.DataSourceType.POSTGRESQL, 
            "jdbc:postgresql://{host}:{port}/{database}");
        JDBC_URL_TEMPLATE_MAP.put(DataPlatformConstants.DataSourceType.SQLSERVER, 
            "jdbc:sqlserver://{host}:{port};DatabaseName={database}");
        JDBC_URL_TEMPLATE_MAP.put(DataPlatformConstants.DataSourceType.DAMENG, 
            "jdbc:dm://{host}:{port}/{database}");
        JDBC_URL_TEMPLATE_MAP.put(DataPlatformConstants.DataSourceType.KINGBASE, 
            "jdbc:kingbase8://{host}:{port}/{database}");
        JDBC_URL_TEMPLATE_MAP.put(DataPlatformConstants.DataSourceType.DORIS, 
            "jdbc:mysql://{host}:{port}/{database}");
    }

    /**
     * 获取数据源驱动类名
     *
     * @param type 数据源类型
     * @return 驱动类名
     */
    public static String getDriverClassName(String type) {
        return DRIVER_CLASS_MAP.get(type);
    }

    /**
     * 构建 JDBC URL
     *
     * @param type     数据源类型
     * @param host     主机地址
     * @param port     端口
     * @param database 数据库名
     * @return JDBC URL
     */
    public static String buildJdbcUrl(String type, String host, Integer port, String database) {
        String template = JDBC_URL_TEMPLATE_MAP.get(type);
        if (template == null) {
            return null;
        }
        return template.replace("{host}", host)
            .replace("{port}", String.valueOf(port))
            .replace("{database}", database);
    }

    /**
     * 获取默认端口
     *
     * @param type 数据源类型
     * @return 默认端口
     */
    public static Integer getDefaultPort(String type) {
        switch (type) {
            case DataPlatformConstants.DataSourceType.MYSQL:
            case DataPlatformConstants.DataSourceType.DORIS:
                return 3306;
            case DataPlatformConstants.DataSourceType.ORACLE:
                return 1521;
            case DataPlatformConstants.DataSourceType.POSTGRESQL:
                return 5432;
            case DataPlatformConstants.DataSourceType.SQLSERVER:
                return 1433;
            case DataPlatformConstants.DataSourceType.DAMENG:
                return 5236;
            case DataPlatformConstants.DataSourceType.KINGBASE:
                return 54321;
            default:
                return null;
        }
    }

    /**
     * 获取数据库连接
     *
     * @param jdbcUrl  JDBC URL
     * @param username 用户名
     * @param password 密码
     * @return 数据库连接
     * @throws Exception 连接异常
     */
    public static java.sql.Connection getConnection(String jdbcUrl, String username, String password) throws Exception {
        return java.sql.DriverManager.getConnection(jdbcUrl, username, password);
    }

}
